home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / data.d < prev    next >
Text File  |  1997-10-26  |  17KB  |  372 lines

  1. DEFINITION MODULE data;
  2.  
  3. (*==============================================================*
  4.  * Modul:               CAT-Datenbank, neue Version             *
  5.  * Autor:               Johannes G”ttker-Schnetmann             *
  6.  * erstellt am:         26.07.1991                              *
  7.  * letzte Žnderung am:  13.08.1993                              *
  8.  * Version:             1.0                                     *
  9.  * Interne Version:     V#0018                                  *
  10.  *==============================================================*
  11.  
  12.   Das Modul implementiert eine nach Gruppen getrennte Datenbank fr die 
  13.   Nachrichten der Maus. Weiterhin werden pro Gruppe drei Positionen 
  14.   verwaltet: letzte gelesene Position, Position der ersten neuen Msg und 
  15.   letzte Msg der Datenbank.
  16.  
  17.   Bei ID's, Namen, und Betreff vorgesehene max. Stringsl„nge ist im
  18.   Moment 1024. (String255)
  19.  
  20.   Achtung, die GruppenNummer ist ab jetzt undefiniert und muž ber GroupNumber
  21.   erfragt werden. Naja vielleicht kann man auch einfach auf die neue Nummerierung
  22.   Rcksicht nehmen, aber besser w„re undefiniert!
  23.  
  24.  *----------------------------------------------------------------------------
  25.  * Datum    Vers. Autor  Žnderung (Arbeitsbericht)
  26.  *----------------------------------------------------------------------------
  27.  * 26.07.91 0001  JGS    Erstellen, erster Vorschlag
  28.  * 14.09.91 0002  JGS    GroupHandles, statt interner Verwaltung
  29.  * 02.10.91       JGS    Doku verbessert
  30.  * 03.10.91 0003  JGS    Kleinere Žnderungen an den Defintionen
  31.  * 06.10.91 0004  JGS    dito
  32.  * 11.10.91 0005  JGS    longString auf 1024 Zeichen verl„ngert
  33.  *                       erste Definition fr AppendMessage
  34.  * 19.10.91 0006  JGS    Doku verbessert, Stringnamen ge„ndert
  35.  * 27.12.91 0007  JGS    Definition AppendMessage/AppendPersonal
  36.  *                       private = 0, seit neuestem! Die entsprechenden Proc's
  37.  *                       k”nnen jetzt damit umgehen.
  38.  * 29.12.91 0008  JGS    Neue Definition der Schreibproc's, Gruppenhandle muž
  39.  *                       bergeben werden.
  40.  * 10.03.92 0009  JGS    Einige Sachen nach CatTypes verlagert sowie
  41.  *                       EstimateNecessaryMemory
  42.  * 19.03.92 0010  JGS    Listen von aužen erweiterbar, fr parser
  43.  * 26.03.92 0011  JGS    Umstellung (mtTextfiles9 fr Behandlung der eigenen,
  44.  *                       pers”nlichen Nachrichten
  45.  * 02.04.92       JGS    Žnderung bei der Definition von "FirstNewMsg"
  46.  * 04.04.92 0012  JGS    Deklaration der Listen ge„ndert, damit sie auch
  47.  *                       im Hauptmodul direkt verwendet werden k”nnen
  48.  * 15.04.92 0013  JGS    Neue Proc PreCheck fr bessere Strukturierung
  49.  * 19.04.92 0014  JGS    Suchen-Deklaration
  50.  * 04.10.92 0015  JGS    Strings in "MessageType" jetzt als Pointer
  51.  * 20.11.92 0016  JGS    Totalabbruch bei Schreibfehler, neues Flag..
  52.  * 23.12.92 0017  JGS    Behandlung der ungelesenen Msgs begonnen
  53.  * 31.12.92       JGS    Baum durchlaufen, Baum l”schen..
  54.  * 09.01.93 0018  JGS    Vererben-Flag, Gefiltert-Flag rein; Gefunden-Flag raus
  55.  * 13.08.93       JGS    Suchroutinendefinition erweitert.
  56.  * 17.08.93       DS     MessageType um Datum im MausTauschformat erweitert
  57.  *----------------------------------------------------------------------------
  58.  *)
  59.  
  60. FROM SYSTEM IMPORT ADDRESS;
  61. FROM Lists    IMPORT List;
  62. FROM CatTypes IMPORT String255, Str255Ptr, DateType, BigTextPtr;
  63. FROM dataSys  IMPORT pBlockPtr, onePos;
  64. IMPORT mtTextfiles;
  65.  
  66. TYPE PosType     = (nextMess, previousMess, nextKom, prevKom, downKom, upKom);
  67.  
  68. TYPE OneGroupHandle;
  69.  
  70. (* Achtung, Žnderungen hier betreffen auch das Acc-Protokoll!! *)
  71. TYPE tDistribution = (dNone, dLokal, dMausNet, dNet);
  72.  
  73.      MessageType = RECORD
  74.        MailNr,
  75.        MailAnz   : CARDINAL;
  76.        KommentierteID : String255;
  77.        fromOther : BOOLEAN; (* Wurde die ID von der anderen Msg gelesen? *)
  78.        MailID,
  79.        Betreff,
  80.        Absender,
  81.        Empfaenger,
  82.        mid,
  83.        rid,
  84.        box,
  85.        gate,
  86.        mime,
  87.        followupTo,
  88.        replyTo,
  89.        sender,
  90.        name     : Str255Ptr; (* zeigen auf Positionen in "InfoStrings" *)
  91.        Gruppe   : CARDINAL;
  92.        Datum,
  93.        StatusDatum            (* nur pers”nliche *)
  94.                 : DateType;
  95.        infoLen  : CARDINAL;   (* letztes Byte in <InfoStrings> *)
  96.        textLen  : CARDINAL;   (* letztes Byte im <Text> *)
  97.  
  98.        StatusBits : BITSET;
  99.  
  100.        up,
  101.        down,
  102.        left,                  
  103.        right  : CARDINAL;
  104.        KommentarAnzahl
  105.                 : CARDINAL;
  106.        statusDate      : LONGCARD;     (* Bei pers”nlichen: Statusdatum im MT-Format *)
  107.        tauschDate      : LONGCARD;     (* Datum im MausTauschformat *)
  108.        EigeneNachricht : BOOLEAN;
  109.        Status : CHAR;
  110.        Text,
  111.        InfoStrings  : BigTextPtr;    (* Freigeben nicht vergessen.. :-) *)
  112.        distribution : tDistribution;
  113.      END;
  114.  
  115.     listEntryType = RECORD
  116.                        len      : CARDINAL;
  117.                        number   : CARDINAL;
  118.                        selected : BOOLEAN;
  119.                        gName    : String255;
  120.                      END;
  121.     listEntryPtr  = POINTER TO listEntryType;
  122.  
  123.     errorType = (noError, notFound, IOError, noMemErr, crcError, fileError);
  124.  
  125. VAR names  : List; (* beide readOnly! *)
  126.  
  127.     error  : errorType; (* Fehlerrckgabe *)
  128.  
  129. PROCEDURE InitDataBase():BOOLEAN;
  130. (* Initialisieren, Fehlermeldung wird selber ausgegeben *)
  131. PROCEDURE ResetDataBase();
  132.  
  133. PROCEDURE CloseBase():BOOLEAN;
  134. (* Datenbank schliežen, abmelden am Ende *)
  135.  
  136. PROCEDURE PrepareToWrite();
  137. (* setzt die Positionen so, daž nach dem Einfgen etwas hbsches rauskommt :-) *)
  138.  
  139. PROCEDURE OpenOneGroup(group, add : CARDINAL; wannaWrite : BOOLEAN; VAR handle 
  140. : OneGroupHandle):BOOLEAN;
  141. (* FALSE, wenn nicht geklappt *)
  142. (* add gibt an, fr wieviele neue Nachrichten Platz ben”tigt wird wenn wannaWrite *)
  143. (* TRUE ist, dann wird auch versucht ein Schreibpuffer fr die DAT anzulegen *)
  144. PROCEDURE CloseOneGroup(VAR handle : OneGroupHandle);
  145. (* Gruppe, die zum Lesen ge”ffnet war schliežen *)
  146. PROCEDURE CloseOneWriteGroup(VAR handle : OneGroupHandle;
  147.                                  newMsg : CARDINAL;
  148.                                  write  : BOOLEAN; 
  149.                              VAR abort  : BOOLEAN);
  150. (* Gruppe, die zum schreiben ge”ffnet war schliežen *)
  151. (* newMsg -> Anzahl der neuen (d.h. nicht gefilterten oder ignorierten) Msgs *)
  152. (* write  -> Puffer wirklich zurckschreiben? Normalerweise nicht bei Abbruch *)
  153. (* abort  -> etwas ist beim Schliežen schiefgelaufen *)
  154.  
  155. PROCEDURE SetLogDate(VAR date : ARRAY OF CHAR);
  156. (* Datum aus dem Logfile bernehmen *)
  157.  
  158. PROCEDURE SaveNames ();
  159. (* Sichert die Liste der Namen komplett 
  160.  *)
  161.  
  162. PROCEDURE AppendName(VAR name : ARRAY OF CHAR);
  163. (* (VAR wg. interner Probleme mit mtTextfiles)
  164.    Neuen Absender bernehmen, meckert selber, falls es nicht klappt *)
  165.  
  166. (*
  167. PROCEDURE AppendGroup(VAR group : ARRAY OF CHAR):BOOLEAN;
  168. (* Neuen Gruppennamen bernehmen, meckert selber, falls es nicht klappt *)
  169. *)
  170.  
  171. PROCEDURE SortList (VAR l : List);
  172. (* Gruppen- oder Namensliste sortieren *)
  173.  
  174.  
  175. PROCEDURE ReadPos():BOOLEAN;
  176. PROCEDURE WritePos():BOOLEAN;
  177. (* Positionstabelle einlesen und schreiben, Fehlermeldung wird ausgegeben *)
  178.  
  179. (*
  180. PROCEDURE GroupNumber(REF gName : ARRAY OF CHAR; VAR nr : CARDINAL):BOOLEAN;
  181. (* Gruppennummer zu einem String feststellen *)
  182. (* Wenn FALSE, dann kommt Gruppenanzahl in nr zurck, Anzahl      *)
  183. (* inklusive pers”nliche                                          *)
  184. PROCEDURE NextGroupNumber(old : CARDINAL):CARDINAL;
  185. (* Nummer der n„chsten Gruppe in der Reihenfolge der momentanen Sortierung *)
  186. (* feststellen; 0FFFF = empty falls keine weiter Gruppe vorhanden ist      *)
  187. PROCEDURE GroupName(nr : CARDINAL; VAR name : ARRAY OF CHAR);
  188. (* Gruppenname zu einer Nummer feststellen, liefert im Fehlerfall *)
  189. (* den letzten Eintrag                                            *)
  190. *)
  191.  
  192. PROCEDURE GetCheckArea (VAR area: onePos);
  193. (* Holt die Prfarea fr das Datum aus dem GRUPPEN.POS
  194.  *)
  195.  
  196. PROCEDURE SetCheckArea (area: onePos);
  197. (* Setzt die Prfarea fr das Datum in dem GRUPPEN.POS
  198.  *)
  199.  
  200. PROCEDURE FirstNewMsg(group : CARDINAL):CARDINAL;
  201. (* erste Msg aus dem letzten Outfile in dieser Gruppe *)
  202. (* "empty", wenn keine neue in dieser Gruppe ist      *)
  203. PROCEDURE LastMsgOfGroup(group : CARDINAL):CARDINAL;
  204. (* letzte Msg der Gruppe *)
  205. PROCEDURE lastReadMsgOfGroup(group : CARDINAL):CARDINAL;
  206. (* letzte vom User gelesene Msg dieser Gruppe *)
  207. PROCEDURE unreadMsgCount(group : CARDINAL):CARDINAL;
  208. (* Anzahl der ungelesenen Msgs in der Gruppe *)
  209. PROCEDURE unreadMsgPos(group : CARDINAL):CARDINAL;
  210. (* Position der ersten ungelesenen Msg in der Gruppe *)
  211.  
  212. PROCEDURE forceUnreadRefresh(handle : OneGroupHandle);
  213. (* erste Ungelesene suchen und durchz„hlen *)
  214. PROCEDURE SetLastReadMsg(group, nr : CARDINAL);
  215. (* neue letzte vom User gelesene Msg setzen *)
  216.  
  217. (* Fehlerrckgabe der n„chsten 2 Positionsfunktionen: noError/notFound *)
  218.  
  219. PROCEDURE NumberOfID(handle : OneGroupHandle; REF ID : ARRAY OF CHAR):CARDINAL;
  220. (* MsgNummer zu einer ID feststellen *)
  221. PROCEDURE NumberOfDate(handle : OneGroupHandle; date : LONGCARD):CARDINAL; 
  222. (* date im Cat-Format, umwandeln mit ConvertDate.StrToDate *)
  223. (* MsgNummer zu einem Datum suchen *)
  224.  
  225. (* M”gliche Fehler: noError, notFound, IOError *)
  226.  
  227. PROCEDURE ReadMessage(handle : OneGroupHandle; nr : CARDINAL; VAR mess : MessageType);
  228. (* Eine Msg aus der Datenbank lesen *)
  229. PROCEDURE ReadSmallHeader(handle : OneGroupHandle; nr : CARDINAL; VAR mess : MessageType);
  230. (* Liest nur die Headerinformationen aus der .PAR-Datei. Alle anderen Daten 
  231.  * sind *nicht* initialisiert
  232.  *)
  233. PROCEDURE ReadHeader(handle : OneGroupHandle; nr : CARDINAL; VAR mess : MessageType);
  234. (* Nur einen Teil der Msg lesen, evtl. weitere Funktionen *)
  235. PROCEDURE ReadState(handle : OneGroupHandle; nr : CARDINAL; VAR flags : BITSET);
  236. (* Nur die Flags lesen, fr "Gelesene ignorieren" *)
  237. PROCEDURE ReadPersState(handle : OneGroupHandle; nr : CARDINAL; VAR state : CHAR; VAR own : BOOLEAN; VAR bits : BITSET);
  238. (* Nur den Status einer pers”nlichen Msg lesen *)
  239. PROCEDURE ReadRightNumber(handle : OneGroupHandle; nr : CARDINAL; VAR right : CARDINAL);
  240. (* Nummer der Nachricht in der Kommentarverkettung nach rechts erfragen *)
  241. PROCEDURE ReadText(handle : OneGroupHandle; nr : CARDINAL; adr : ADDRESS);
  242. (* den Text zur msg in den Puffer lesen, muž natrlich grož genug sein! *)
  243. PROCEDURE SetBits(handle : OneGroupHandle; nr : CARDINAL; bits : BITSET);
  244. (* Statusbits setzen *)
  245. PROCEDURE ChangeState(handle : OneGroupHandle; nr : CARDINAL;NewState : CHAR);
  246. (* StatusChar setzen *)
  247. PROCEDURE HasAnswer(handle : OneGroupHandle; nr : CARDINAL; VAR bits : BITSET):BOOLEAN;
  248. (* Testet, ob diese Msg noch eine Antwort hat, fr grin.grinResetState *)
  249.  
  250. (* Idee: Bei Fehler Einfgen abbrechen und Fehlerdatei schreiben; 
  251.  * Fehlerbehandlung ber eigenes Programm
  252.  *)
  253.  
  254.  
  255. TYPE SearchType = (inBits, inText, changeBits, dontShow, ask, reverse);
  256. (* Die ersten drei geben je an, wo gesucht werden soll. changeBits sagt, *)
  257. (* daž die Bits der gefundenen Msg gem„ž der Setzmaske gesetzt werden    *)
  258. (* sollen. Bei dontShow werden alle Msgs bis zum Ende behandlet. Mit     *)
  259. (* reverse kann man die Suchrichtung auf rckw„rtes stellen              *)
  260. TYPE SearchSet  = SET OF SearchType;
  261.  
  262. PROCEDURE ComplexSearch(handle  : OneGroupHandle;
  263.                         start   : CARDINAL;         (* StartNachricht         *)
  264.                         setBits,
  265.                         clearBits  : BITSET;        (* Zusammen Suchmaske     *)
  266.                     VAR str, str2, 
  267.                         str3, str4 : ARRAY OF CHAR; (* Zu suchender String    *)
  268.                         wo1, wo2, 
  269.                         wo3, wo4   : INTEGER;       (* Wo sollen sie stehen?  *)
  270.                         verkn1, verkn2,
  271.                         verkn3     : INTEGER;       (* logische Verknpfung   *)
  272.                         gross      : BOOLEAN;       (* grož=klein?            *)
  273.                         toSetBits,
  274.                         toClearBits  : BITSET;      (* Zusammen Setzmaske     *)
  275.                         what         : SearchSet;   (* Was machen?            *)
  276.                     VAR break : BOOLEAN;            (* Abbruch durch esc?     *)
  277.                     VAR nr : CARDINAL):BOOLEAN;     (* Nummer, falls gefunden *)
  278. (* Sucht eine Nachricht nach den angegebenen Werten, falls sie gefunden wird *)
  279. (* dann ist found TRUE und es wird die Nummer dieser Nachricht zurckgegeben *)
  280. (* str wird evtl. wegen grož-klein-Unterscheidung ge„ndert, deswegen         *)
  281. (* vielleicht einen Backup-String bergeben.                                 *)
  282. (* wo1..wo4, verkn1..verkn3 wie in SearchHelp.. *)
  283.  
  284. (* šbergabetypen fr Appendmessage *)
  285.  
  286. TYPE stringTypes = (bId, bEZeit, bGruppe, bBSZeit,
  287.                     bWegen, bVon, bAn, bMId, bRId, bBox, bName, bRefNr, 
  288.                     bDistribution, bGate, bMime, bFollowupTo, bReplyTo, bSender, (* Reihenfolge wichtig! *)
  289.                     bText, bTextDatei);
  290. TYPE stringSet = SET OF stringTypes;
  291.  
  292. (* Neue Reihenfolge fr WatchDog-Protokoll, wegen Kompatibilit„t *)
  293. (* WatchDog darf nur gefragt werden, wenn es keine pers”nliche   *)
  294. (* Msg ist, sonst ist evtl. z.B. pText NIL                       *)
  295. TYPE PtrRecord =
  296.        RECORD
  297.          pGruppe, pVon,         (* Absender,          Gruppe            *)
  298.          pWegen  : Str255Ptr;   (* Betreff,                             *)
  299.          pText   : BigTextPtr;  (* MsgText                              *)
  300.          TextMax : CARDINAL;
  301.          pId,                   (* Maus-ID der Mitteilung               *)
  302.          pRefNr,   pAn,         (* kommentierte Msg,  Empf„nger         *)
  303.          pEZeit,   pBSZeit,     (* Eingabezeit,       Bearb.status+Zeit *)
  304.          pMId,     pRId,        (* MessageID,         RId gem. Def      *)
  305.          pBox,                  (* Box gem. Def.                        *)
  306.          pName,                 (* Name gem. Def falls # Absenderangabe *)
  307.          pGate,                 (* Gateway *)
  308.          pMime,                 (* MIME-Zeile *)
  309.          pFollowupTo,           (* FollowUp-To - Zeile *)
  310.          pReplyTo,              (* Reply-To - Zeile *)
  311.          pSender : Str255Ptr;   (* Sender - Zeile *)
  312.          (* Achtung, die Gr”že dieses Strings wird bei der Verkettung *)
  313.          (* per RId ben”tigt -> bei Žnderungen bercksichtigen *)
  314.          txt     : mtTextfiles.TEXTFILE;
  315.          whatsThere : stringSet;
  316.          pDistribution : Str255Ptr; (* Distribution *)
  317.        END;
  318.  
  319. (* Falls das Bit bTextDatei gesetzt ist, dann soll der Text aus der bergebenen *)
  320. (* Datei bernommen werden, er steht dann nicht im Speicher                     *)
  321. (* !!Achtung: Weiterhin ist dieses Bit der Anzeiger dafr, daž es sich bei      *)
  322. (* dieser  Message um eine eigene handelt, die gerade eingefgt werden soll.    *)
  323.  
  324. TYPE WhatsThat = (own, personal, status, normal, garbage);
  325.  
  326. PROCEDURE PreCheck(VAR mess : PtrRecord):WhatsThat;
  327. (* Testet die Nachricht einmal durch, damit der parser schon einen Teil der *)
  328. (* Fehlerbehandlung sowie die WatchDog-Behandlung machen kann               *)
  329.  
  330. PROCEDURE AppendMessage(handle : OneGroupHandle;
  331.                         type   : WhatsThat;
  332.                         bitWishes : BITSET;
  333.     (* Bits, die beim Einfgen schon gesetzt werden sollen; bFiltered bisher *)
  334.                     VAR mess   : PtrRecord;
  335.                     VAR usenetChain, usnetOk : BOOLEAN;
  336.                     VAR isOneDupe: BOOLEAN;
  337.                     VAR abort  : BOOLEAN):BOOLEAN;
  338. (* Eine Message bearbeiten/ abort -> sofort abbrechen, schwerer Fehler *)
  339. (* Returnwert zeigt an, ob die Nachricht geschrieben wurde *)
  340. (* Es k”nnen natrlich nur die Typen own, personal, status und normal geschrieben *)
  341. (* werden. Bei Mižbrauch: Garbage in possible crash out! *)
  342.  
  343. PROCEDURE dumpMess(mess : PtrRecord);
  344. (* Fehlermeldung zu dieser Nachricht in catlog.txt ausgeben *)
  345.  
  346. PROCEDURE EstimateNecessaryMemory():LONGCARD;
  347. (* Versucht den fr den n„chsten Einfgevorgang n”tigen Platz zu sch„tzen *)
  348.  
  349. (*$H+*)
  350. TYPE treeProc = PROCEDURE ((* handle: *) OneGroupHandle,
  351.                            (* msgIdx: *) CARDINAL,
  352.                            (* mess:   *) pBlockPtr);
  353.  
  354. PROCEDURE WalkTree (handle : OneGroupHandle; mess: CARDINAL; fromTop : BOOLEAN; proc: treeProc);
  355. (* Allgemeine Prozedur, um einen Baum zu durchlaufen *)
  356.  
  357. PROCEDURE WalkTree2 (handle : OneGroupHandle; mess: CARDINAL; maxUp: INTEGER; maxDepth: INTEGER; proc: treeProc);
  358. (* Etwas weniger allgemeine Prozedur, um einen Baum zu durchlaufen 
  359.  * Es wird maximal um maxUp Ebenen nach oben gegangen, und von dort aus 
  360.  * maximal maxDepth Ebenen nach unten 
  361.  *)
  362.  
  363. TYPE updateProc = PROCEDURE((* msgIndex *) CARDINAL, (* newFlags *) BITSET);
  364. TYPE flagchangeProc = PROCEDURE( (* oldFlags *) BITSET ) : BITSET;
  365.  
  366. PROCEDURE TreeFlags(handle : OneGroupHandle; mess : CARDINAL; fromTop : BOOLEAN; 
  367.                     updt : updateProc; flagchange : flagchangeProc);
  368. (* Flags eines Baumes bearbeiten *)
  369.  
  370. END data.
  371.  
  372.